package com.ruoyi.learn.java.collection;

import java.util.HashMap;
import java.util.Map;

public class HashMapDemo {

    public static void main(String[] args) {
        // 创建一个HashMap实例
        HashMap<String, Integer> map = new HashMap<>();
        System.out.println("HashMap size: " + map.size());
        map.put(null, null);
        System.out.println("HashMap size: " + map.size());
        map.put("", null);
        System.out.println("HashMap size: " + map.size());

        // 向HashMap中添加键值对
        map.put("Apple", 10);
        map.put("", null);
        map.put(null, null);
        /**
         *     static final int hash(Object key) {
         *         int h;
         *         return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
         *     }
         */
        // 对键的原始哈希码进行扰动，以提高哈希分布的均匀性，从而减少 HashMap 中的哈希冲突。
        /**
         * “在扩容时，可以根据 hash & oldCap 判断是否需要迁移（0 → 原位置，1 → 原位置 + oldCap）”
         *
         * 这不仅是正确的，而且是 Java 8 HashMap 性能优于 JDK 7 的关键原因之一。
         *
         * 它利用了：
         *
         * 2 的幂容量
         * 位运算索引计算
         * 扰动函数保证 hash 分布
         * 三者协同，实现了 高效寻址 + 高效扩容 的极致优化。
         *
         * 这正是 HashMap 成为 Java 中最常用、最高效集合之一的核心秘密。
         */

        map.put("Banana", 20);
        map.put("Orange", 30);

        // 从HashMap中获取值
        int appleCount = map.get("Apple");
        System.out.println("Apple count: " + appleCount);

        // 检查HashMap中是否包含某个键
        boolean hasBanana = map.containsKey("Banana");
        System.out.println("Contains Banana: " + hasBanana);

        // 遍历HashMap
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
        }
        System.out.println("HashMap size: " + map.size());

        // 删除HashMap中的键值对
        map.remove("Orange");

        // 检查HashMap的大小
        System.out.println("HashMap size: " + map.size());
        map.remove(null);
        System.out.println("HashMap size: " + map.size());

    }

}
